package com.wu01.demo.newdemo.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.example.java_learning.listener.UploadDataListener;
import com.example.java_learning.service.UploadService;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collection;

/**
 * @author wubingcang
 * @desc 阿里easyexcel工具
 * @date 2024年04月21日 7:30
 */
public class EasyExcelUtils {
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    public static <T> void download(HttpServletResponse response, String fileName, Class<T> clazz, Collection<T> data) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        fileName = URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+","%20");
        response.setHeader("Content-disposition","attachment;filename*=utf-8''"+fileName+".xlsx");
        EasyExcel.write(response.getOutputStream(),clazz)
                .excelType(ExcelTypeEnum.XLSX)
                .sheet("模板")
                .doWrite(data);
    }

    /**
     * 文件上传
     * <p>1. 创建excel对应的实体对象
     * <p>2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，参照{@link UploadDataListener}
     * <p>3. 直接读即可
     */
    public static String upload(MultipartFile file, Class<?> clazz, UploadService uploadService)throws IOException {
        EasyExcel.read(file.getInputStream(),clazz,new UploadDataListener(uploadService)).sheet().doRead();
        return"success";
    }

}
